import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Program {
	public static void main(String[] args) {// 将容器ff的布局设为GridBagLayout
		Frame ff = new Frame();
		GridBagLayout gr = new GridBagLayout();
		GridBagConstraints gc = new GridBagConstraints(); // 创建一个名为gc的约束对象
		ff.setLayout(gr);
		
		// 创建一组按钮组件
		Button bb1 = new Button("bb1");
		Button bb2 = new Button("bb2");
		Button bb3 = new Button("bb3");
		Button bb4 = new Button("bb4");
		Button bb5 = new Button("bb5");
		Button bb6 = new Button("bb6");
		Button bb7 = new Button("bb7");
		Button bb8 = new Button("bb8");

		gc.fill = GridBagConstraints.BOTH;
		gc.weightx = 11;
		gc.weighty = 11;
		gr.setConstraints(bb1, gc);

		gc.weightx = 22;
		gc.gridx = 1;
		gc.gridy = 1; // 将下一个组件放置在坐标为1,1的位置。
		gr.setConstraints(bb2, gc);

		gc.weightx = 33;
		gc.gridx = 2;
		gc.gridy = 1; // 将下一个组件放置在坐标为2,1的位置。
		gc.insets = new Insets(-10, -10, -10, -10); // 将下一个组件与网格单元的空白区域向外扩展10个像素,在这里可以看到网格包布局允许组件之间重叠。
		gc.gridwidth = GridBagConstraints.REMAINDER;
		gr.setConstraints(bb3, gc);

		GridBagConstraints gc1 = new GridBagConstraints();

		gc1.weighty = 22;
		gc1.ipadx = 50;
		gc1.ipady = 50; // 将组件的最小尺寸加大ipadx*2个像素。
		gr.setConstraints(bb4, gc1);
		gc1.ipadx = 0;
		gc1.ipady = 0; // 将以后的组件的最小尺寸设置为默认值,如果省掉该行,则以后组件的最小尺寸都会加大ipadx*2个像素。
		gc1.anchor = GridBagConstraints.NORTHWEST; // 将下一个组件bb5的位置放置在单元网格的西北方向。
		gr.setConstraints(bb5, gc1); // 因为bb5未设置fill,同时bb5设置了weightx(由gc参数设置)和weighty两个值以确定bb5所在的网格单元的大小，因而组件bb5的原始最小尺寸无法占据整个网格单元。

		gc1.fill = GridBagConstraints.BOTH;
		gc1.gridwidth = GridBagConstraints.REMAINDER;
		gr.setConstraints(bb6, gc1);

		gc1.weighty = 33;
		gc1.insets = new Insets(5, 15, 40, 150); // 使下一个组件bb7与网格单元之间在上，左，下，右，分别保持5,15,40,150个像素的空白位置。
		gr.setConstraints(bb7, gc1);
		gc1.weighty = 0;
		gc1.insets = new Insets(0, 0, 0, 0); // 将insets的参数值设为默认值。
		gr.setConstraints(bb8, gc1);
		ff.setSize(500, 300);
		ff.add(bb1);
		ff.add(bb2);
		ff.add(bb3);
		ff.add(bb4);
		ff.add(bb5);
		ff.add(bb6);
		ff.add(bb7);
		ff.add(bb8);
		ff.setVisible(true);
		ff.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}
}
